//package com.example.campus.interceptor;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.core.util.StrUtil;
//import com.example.campus.pojo.dto.UserLoginDTO;
//import com.example.campus.properties.JwtProperties;
//import com.example.campus.utils.JwtUtil;
//import com.example.campus.utils.constant.JwtClaimsConstant;
//import com.example.campus.utils.constant.RedisConstant;
//import com.example.campus.utils.context.BaseContext;
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.ExpiredJwtException;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
//@Component
//@Slf4j
//public class RefreshJwtTokenUserInterceptor implements HandlerInterceptor {
//    @Autowired
//    private JwtProperties jwtProperties;
//
//    @Autowired
//    private StringRedisTemplate stringRedisTemplate;
//
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        String token = request.getHeader(jwtProperties.getUserTokenName());
//        if (StrUtil.isBlank(token)) {
//            return true;
//        }
//
//        try {
//            // 验证JWT签名
//            Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
//
//            // 检查是否需要刷新
//            Date expiration = claims.getExpiration();
//            log.info("时间 {}", expiration);
//            long remainingMillis = expiration.getTime() - System.currentTimeMillis();
//
//            // 如果剩余时间小于刷新阈值（如15分钟），则刷新
//            if (remainingMillis < 15 * 60 * 1000) {
//                String redisKey = RedisConstant.LOGIN_USER_KEY + token;
//                Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(redisKey);
//                log.info("userMap {}", userMap);
//                if (!userMap.isEmpty()) {
//                    // 生成新JWT
//                    Map<String, Object> newClaims = new HashMap<>();
//                    newClaims.put(JwtClaimsConstant.USER_ID, userMap.get("id"));
//
//                    String newToken = JwtUtil.createJWT(
//                            jwtProperties.getUserSecretKey(),
//                            jwtProperties.getUserTtl(),
//                            newClaims
//                    );
//
//                    // 更新Redis
//                    String newRedisKey = RedisConstant.LOGIN_USER_KEY + newToken;
//                    stringRedisTemplate.opsForHash().putAll(newRedisKey, userMap);
//                    stringRedisTemplate.expire(newRedisKey, RedisConstant.LOGIN_USER_TTL, TimeUnit.MINUTES);
//
//                    // 删除旧令牌
//                    stringRedisTemplate.delete(redisKey);
//
//                    // 返回新令牌给客户端
//                    response.setHeader(jwtProperties.getUserTokenName(), newToken);
//                    log.info("JWT已刷新: {}", newToken);
//                }
//            }
//
//            return true;
//        } catch (ExpiredJwtException e) {
//            // JWT已过期，直接放行，由主拦截器处理
//            return true;
//        } catch (Exception e) {
//            log.error("刷新JWT失败: {}", e.getMessage());
//            return true;
//        }
//    }
//}
